// funcs.h

// Copyright (C) 2010  traxex

// Author: 	traxex <traxex@yahoo.cn>
// Created: 	20 Aug 2010
// Version: 	1.0

#pragma once

namespace traxex{
namespace cuda{

template<typename T> __global__ void hamming_k( vector<T> v, T tmp1){
    if( _vi >= v.N) return;
    //tmp1 = 2*PI/v.N;
    v(_vi) = T(0.54)-T(0.46)*cos(tmp1*_vi);
}

namespace{
#define TRAXEX_VECTOR_OP_FUNC_K( opname, op)                            \
    template<typename T> __global__ void _##opname##_k( vector<T> v, vector<T>a, vector<T> b){ \
        if( _vi >= b.N) return;                                         \
        v(_vi) = a(_vi) op b(_vi);                                      \
    }                                                                   \
    template<typename T> __global__ void _e##opname##_k( vector<T>a, vector<T> b){ \
        if( _vi >= b.N) return;                                         \
        a(_vi) CAT(op,=) b(_vi);                                        \
    }
}

TRAXEX_VECTOR_OP_FUNC_K( add, +)
TRAXEX_VECTOR_OP_FUNC_K( sub, -)
TRAXEX_VECTOR_OP_FUNC_K( mul, *)
TRAXEX_VECTOR_OP_FUNC_K( div, /)

namespace{
#define TRAXEX_MATRIX_OP_FUNC_K( opname, op)                            \
    template<typename T> __global__ void _##opname##_k( matrix<T> v, matrix<T>a, matrix<T> b){ \
        if( _my >= a.Y || _mx >= a.X) return;                           \
        v(_my, _mx) = a(_my, _mx) op b(_my, _mx);                       \
    }                                                                   \
    template<typename T> __global__ void _e##opname##_k( matrix<T>a, matrix<T> b){ \
        if( _my >= a.Y || _mx >= a.X) return;                           \
        a(_my, _mx) CAT(op,=) b(_my, _mx);                              \
    }
}
TRAXEX_MATRIX_OP_FUNC_K( add, +)
TRAXEX_MATRIX_OP_FUNC_K( sub, -)
TRAXEX_MATRIX_OP_FUNC_K( mul, *)
TRAXEX_MATRIX_OP_FUNC_K( div, /)

}
}
